package com.itany.corejava.code07_面向对象.多态;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月03日 16:02
 */
public class Person {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println("姓名:" + name + ",年龄:" + age);
    }

}

class Man extends Person {
    public Man(String name, int age) {
        super(name, age);//调用父类构造方法
    }

    public void show() {
        System.out.println("我是一个男的，我的姓名是:" + getName() + ",年龄是:" + getAge());
    }

    public void work() {
        System.out.println("我是一个男的，我需要好好工作，养家糊口");
    }
}
class Woman extends Person{
    public Woman(String name, int age) {
        super(name, age);
    }
}
class Test {
    public static void main(String[] args) {
        // 自动类型 小->大
        int a = 10;
        long b = a;

        // 子类->父类
       /* 自动类型转换
            将父类的引用指向子类的对象，称为向上转型，会自动进行类型转换
            通过父类的引用的变量调用的方法只能是在父类中存在的方法，无法调用子类特有的方法
            如果子类重写了父类的方法，则指向的是子类的方法*/

        // Man man=new Man("陈诚",40);
        // Person person=man;

        Person person = new Man("陈诚", 20);
        System.out.println(person);
        person.show();
        // person.work();//报错,无法调用子类特有的方法

        // 强制类型转换:大->小    父类->子类
        double x=12.567;
        int y=(int)x;
        System.out.println(y);


        // java.lang.ClassCastException 类转换异常
        // Person p=new Person("小花",20);
        // Man m=(Man)p;//向下转型

        //强制类型转换:
        // 子类的引用 ‐‐> 父类的引用 ‐‐> 子类的对象
        // 语法:(子类引用的类型)指向子类对象的父类引用
        // 将父类的引用指向子类的引用时候，称之为向下转型，此时必须通过强制类型转换的方式进行转换
        // 向下转型后，可以正常访问子类所特有的方法
        // 但是，使用强制类型转换时候，如果子类的对象与最终子类的引用不是同一个类型，会抛出ClassCastException
        // 向下转型是不安全的，转换之前可以事先判断一下是否可以转换，避免出现ClassCastException
        //使用 instanceof 来进行判断，变量(父类的引用)  instanceof 子类


        System.out.println(person instanceof Man);
        if(person instanceof  Man){
            Man m2 = (Man) person;
            m2.show();
            m2.work();
        }else{
            System.out.println("person无法转换为Man");
        }
        //
        // 结论:
        //     实现多态的条件
        //         1.继承是多态的基础，没有继承没有多态
        //         2.子类重写父类的方法，多态下调用的是子类重写的方法
        //         3.父类引用指向子类，属性向上转型
        //








    }
}